/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 * 
 * System Name        : フレームワーク
 * Description        : 
 * 
 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
package com.cloud.pora.mrm.web.common.util;

import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.List;

/**
 * <H3>ユーティリティクラス</H3>
 * 
 * <PRE>
 * 
 * チェックのユーティリティ・クラスです。
 * 
 * </PRE>
 * 
 * @author	Wangjiquan
 * @version	1.0   2010/10/11
 */
public class CommonUtil {

	/**
	 * <H3>トリム.</H3>
	 * 
	 * <PRE>
	 * 
	 * 先頭と最後の空白は削除する。 <br>
	 * 
	 * </PRE>
	 * 
	 * @param prmString
	 *            対象文字列
	 * @return String 空白を削除した文字列
	 */
	public static String trimSpace(String prmString) {

		// 入力文字のnull・空文字チェック
		if (CheckUtil.isEmpty(prmString)) {
			return prmString;
		}

		// trim
		return prmString.trim();
	}

	/**
	 * 数値フォーマット(数値をカンマ付きに編集)を行う
	 * 
	 * @param strInput
	 *            編集前数値
	 * @return String 編集後数値
	 */
	public static String numFormat(String strInput) {

		boolean blnMinus = false;
		boolean blnPlus = false;
		int intStrIndex = 0;
		StringBuffer strbuffData = new StringBuffer();
		int intStrLength = 0;

		if (strInput == null || strInput.length() == 0) {
			return strInput;
		}

		if (strInput.substring(0, 1).equals("-")) {
			blnMinus = true;
			strInput = strInput.substring(1);
		} else if (strInput.substring(0, 1).equals("+")) {
			blnPlus = true;
			strInput = strInput.substring(1);
		}

		//小数点のチェック
		String strInt = null;
		String strDec = null;

		int intDecPos = strInput.indexOf(".");

		if (intDecPos >= 0) {
			strInt = strInput.substring(0, intDecPos);
			strDec = strInput.substring(intDecPos + 1, strInput.length());
		} else {
			strInt = strInput;
		}

		if (CheckUtil.isEmpty(strInt) || !CheckUtil.checkNumber(strInt)) {
			return null;
		}
		if (strDec != null && !CheckUtil.checkNumber(strDec)) {
			return null;
		}

		intStrLength = strInt.length();
		for (; intStrIndex < intStrLength - 3; intStrIndex = intStrIndex + 3) {
			strbuffData.insert(0, strInt.substring(intStrLength - intStrIndex
					- 3, intStrLength - intStrIndex));
			strbuffData.insert(0, ",");
		}

		strbuffData.insert(0, strInt.substring(0, intStrLength - intStrIndex));

		if (blnMinus) {
			strbuffData.insert(0, "-");
		} else if (blnPlus) {
			strbuffData.insert(0, "+");
		}

		if (!CheckUtil.isEmpty(strDec)) {
			strbuffData.append("." + strDec);
		}

		return strbuffData.toString();

	}

	/**
	 * 数値フォーマット(数値をカンマ付きに編集)を行う
	 * 
	 * @param intInput
	 *            編集前数値
	 * @return String 編集後数値
	 */
	public static String numFormat(int intInput) {
		return numFormat(Integer.toString(intInput));
	}

	/**
	 * ms系unicodeを標準のunicodeにう変換
	 * 
	 * @param s
	 *            変換したい文字列
	 * @return String 変換した文字列
	 */
	public static String msToStd(String s) {
		StringBuffer sb = new StringBuffer();
		char c;
		if (s == null || s.length() == 0) {
			return s;
		}
		for (int i = 0; i < s.length(); i++) {
			c = s.charAt(i);
			switch (c) {
			case 0xff3c: // FULLWIDTH REVERSE SOLIDUS ->
				c = 0x005c; // REVERSE SOLIDUS
				break;
			case 0xff5e: // FULLWIDTH TILDE ->
				c = 0x301c; // WAVE DASH
				break;
			case 0x2225: // PARALLEL TO ->
				c = 0x2016; // DOUBLE VERTICAL LINE
				break;
			case 0xff0d: // FULLWIDTH HYPHEN-MINUS ->
				c = 0x2212; // MINUS SIGN
				break;
			case 0xffe0: // FULLWIDTH CENT SIGN ->
				c = 0x00a2; // CENT SIGN
				break;
			case 0xffe1: // FULLWIDTH POUND SIGN ->
				c = 0x00a3; // POUND SIGN
				break;
			case 0xffe2: // FULLWIDTH NOT SIGN ->
				c = 0x00ac; // NOT SIGN
				break;
			}
			sb.append(c);
		}
		return new String(sb);
	}

	/**
	 * 標準のunicodeをms系unicodeに変換
	 * 
	 * @param s
	 *            変換したい文字列
	 * @return String 変換した文字列
	 */
	public static String stdToMs(String s) {
		StringBuffer sb = new StringBuffer();
		char c;
		if (s == null || s.length() == 0) {
			return s;
		}
		for (int i = 0; i < s.length(); i++) {
			c = s.charAt(i);
			switch (c) {
			case 0x005c: // REVERSE SOLIDUS ->
				c = 0xff3c; // FULLWIDTH REVERSE SOLIDUS
				break;
			case 0x301c: // WAVE DASH ->
				c = 0xff5e; // FULLWIDTH TILDE
				break;
			case 0x2016: // DOUBLE VERTICAL LINE ->
				c = 0x2225; // PARALLEL TO
				break;
			case 0x2212: // MINUS SIGN ->
				c = 0xff0d; // FULLWIDTH HYPHEN-MINUS
				break;
			case 0x00a2: // CENT SIGN ->
				c = 0xffe0; // FULLWIDTH CENT SIGN
				break;
			case 0x00a3: // POUND SIGN ->
				c = 0xffe1; // FULLWIDTH POUND SIGN
				break;
			case 0x00ac: // NOT SIGN ->
				c = 0xffe2; // FULLWIDTH NOT SIGN
				break;
			}
			sb.append(c);
		}
		return new String(sb);
	}


	/**
	 * <PRE>
	 * 
	 * 文字列の前のゼロを取り除く。 <br>
	 * 
	 * </PRE>
	 * 
	 * @param strParam
	 *            対象文字列
	 * @return String 編集した文字列
	 */
	public static String cutBeforeZero(String strParam) {
		//		String strReturn = "";
		//		String strTemp = "";
		//		int intZeroI = 0;
		//		try {
		//			if (strParam != null && !"".equals(strParam)) {
		//				if (strParam.length() == 10) {
		//					while ("0".equals(strParam.substring(intZeroI, intZeroI + 1))) {
		//						intZeroI++;
		//					}
		//					strReturn = strParam.substring(intZeroI);
		//				}
		//			}
		//		} catch (Exception e) {
		//			e.printStackTrace();
		//		}
		//		return strReturn;

		String strReturn = "";

		//		int intReturn = 0;
		//		if (strParam != null && !"".equals(strParam)) {
		//			if(strParam.length() > 0) {
		//				intReturn = Integer.parseInt(strParam);
		//				strReturn = Integer.toString(intReturn);
		//			}
		//		}
		long lngReturn = 0;
		if (strParam != null && !"".equals(strParam)) {
			if (strParam.length() > 0) {
				lngReturn = Long.parseLong(strParam);
				strReturn = Long.toString(lngReturn);
			}
		}
		return strReturn;

	}

	/**
	 * <PRE>
	 * 
	 * NULL -> ブランクを編集する。 <br>
	 * 
	 * </PRE>
	 * 
	 * @param strParam
	 *            文字列
	 * @return String 編集した文字列
	 */
	public static String isNulltoBlank(String strParam) {

		String strReturn = strParam;
		if (strParam == null) {
			strReturn = "";
		}

		return strReturn;
	}

	/**
	 * <PRE>
	 * 
	 * 更新時刻を編集する。 <br>
	 * Example: strUpdatetime :61231 return :061231
	 * 
	 * </PRE>
	 * 
	 * @param strUpdateTime
	 *            対象文字列
	 * @return String 編集した文字列
	 */
	public static String makeRPGParam2UpdateTime(String strUpdateTime) {

		if (strUpdateTime == null || strUpdateTime.equals("")) {
			return null;
		}

		String strResult = null;
		int timeLength = strUpdateTime.length();
		if (timeLength == 6) {
			strResult = strUpdateTime;
		} else if (timeLength > 6) {
			strResult = strUpdateTime.substring(0, 6);
		} else if (timeLength < 6) {
			strResult = strUpdateTime;
			for (int i = 0; i < (6 - timeLength); i++) {
				strResult = "0" + strResult;
			}
		}
		return strResult;
	}

	/**
	 * <H3>トリム.</H3>
	 * 
	 * <PRE>
	 * 
	 * AS400へのパラメータ２結果を取得する。 <br>
	 * 
	 * </PRE>
	 * 
	 * @param strResultString
	 *            対象文字列
	 * @param intParams
	 *            対象文字列のサイズ
	 * @return String[] 編集した文字列
	 * 
	 * @author 丁 忠涛
	 */
	public static String[] getRPGParameter2(String strResultString,
			int[] intParams) {

		String[] aryResultString = null;
		//対象文字列がNULLではない、又は、対象文字列と対象文字列のサイズの個数が同じです
		if (strResultString != null && strResultString.length() > 0) {

			if (intParams != null && intParams.length > 0) {
				aryResultString = new String[intParams.length];
				int intStartLenth = 0;
				for (int i = 0; i < intParams.length; i++) {
					int paramsLength = intParams[i];

					if (i == 0) {
						aryResultString[i] = strResultString.substring(0,
								paramsLength).trim();
						intStartLenth = paramsLength;
					} else {
						if (i == intParams.length - 1) {
							aryResultString[i] = strResultString
									.substring(intStartLenth);
						} else {
							aryResultString[i] = strResultString.substring(
									intStartLenth,
									((intStartLenth + paramsLength)));
						}
						intStartLenth = paramsLength + intStartLenth;
					}
				}
			}
		}

		return aryResultString;
	}

	/**
	 * 
	 * 指定された桁数になるよう左から指定された値を埋めます。
	 * 
	 * @param data
	 *            対象文字列
	 * @param fill
	 *            埋める値
	 * @param length
	 *            桁数
	 * @return ( n * 0 ) + データ
	 */
	public static String fillInLeft(String data, char fill, int length) {

		StringBuffer fmtData = new StringBuffer();
		int zeroSu;

		if (data == null) {

			data = "";
			zeroSu = length;

		} else if (data.getBytes().length > length) {

			zeroSu = 0;

		} else {

			zeroSu = length - data.getBytes().length;

		}

		for (int i = 0; i < zeroSu; i++)
			fmtData.append(fill);

		fmtData.append(data);
		return fmtData.toString();

	}

	/**
	 * 
	 * 指定された桁数になるよう右から指定された値を埋めます。
	 * 
	 * @param data
	 *            対象文字列
	 * @param fill
	 *            埋める値
	 * @param len
	 *            桁数
	 * @return データ + ( fill * len )
	 */
	public static String fillInRight(String data, char fill, int len) {

		// 指定長が「0」の場合も「0」を返す。
		if (len == 0)
			return data;

		// 基本情報が「null」もしくは、指定長より長い場合は加工処理をしない
		if (data == null || data.getBytes().length > len)
			return data;

		int diffLen = len - data.getBytes().length;
		StringBuffer fmtStr = new StringBuffer(data);

		for (int i = 0; i < diffLen; i++)
			fmtStr.append(fill);

		return fmtStr.toString();

	}

	/**
	 * 
	 * カンマを除去します。
	 * 
	 * @param strInput
	 *            カンマを含む文字列データ
	 * @return カンマを除去された文字列
	 */
	public static String removeComma(String strInput) {
		if (strInput == null) {
			return null;
		}
		if (strInput.length() < 1 || strInput.equals("")) {
			return null;
		}
		StringBuffer stbValue = new StringBuffer(strInput);

		for (int i = 0; i < stbValue.length(); i++) {
			char parts = stbValue.charAt(i);
			if (parts == ',') {
				//カンマを発見したら除去し、オフセットを１つ戻す
				stbValue = stbValue.deleteCharAt(i);
				i--;
			}
		}

		return stbValue.toString();

	}

	/**
	 *set_classの値 TO get_classの値
	 *
	 * @param inObj    From class 
	 * @param outObj   To   class
	 */
	public static void reflectClass(Object inObj, Object outObj) {
		//import org.apache.commons.beanutils.PropertyUtils;
		//PropertyUtils.copyProperties(inObj,outObj);
		final String CLASS = "class ";
		final String SET = ".set";
		final String JAVA = "(java";
		final String JAVA1 = "(int";
		try {
			///////////////////////////////////
			if (inObj == null || outObj == null) {
				return;
			}
			String inClassName =
				("" + inObj.getClass()).substring((CLASS).length());
			//			System.out.println("outClassName=="+inClassName);				
			Class inClass = Class.forName(inClassName);
			Method[] get = inClass.getMethods();

			///////////////////////////////////
			String outClassName =
				("" + outObj.getClass()).substring((CLASS).length());
			//			System.out.println("outClassName==="+outClassName);				
			Class outClass = Class.forName(outClassName);
			Method[] set = outClass.getMethods();

			String name = "";

			for (int i = 0; i < set.length; i++) {
				name = "" + set[i];
				if (name.indexOf(outClassName + ".set") > 0) {
					try {
						//System.out.println(name);
						//type creat
						Class[] sArgTypes = {
						};
						Class[] gArgTypes = null;

						////////////////////////////////////////////////////////
						Class[] STRING_TYPES = { String.class };
						Class[] STRING_GROUP_TYPES = { String[].class };
						Class[] LIST_TYPES = { List.class };
						Class[] LIST_GROUP_TYPES = { List[].class };
						Class[] OBJECT_TYPES = { Object.class };
						Class[] OBJECT_GROUP_TYPES = { Object[].class };
						Class[] INT_TYPES = { Integer.TYPE };
						Class[] INT_GROUP_TYPES = { int[].class };
						Class[] LONG_TYPES = { Long.TYPE };
						Class[] LONG_GROUP_TYPES = { long[].class };
						Class[] BIGDECIMAL_TYPES = { BigDecimal.class };
						Class[] BIGDECIMAL_GROUP_TYPES = { BigDecimal[].class };
						////////////////////////////////////////////////////////
						if (name.indexOf("(java.lang.String)") > 0) {
							gArgTypes = STRING_TYPES;
						} else if (name.indexOf("(java.lang.String[])") > 0) {
							gArgTypes = STRING_GROUP_TYPES;
						} else if (name.indexOf("(java.util.List)") > 0) {
							gArgTypes = LIST_TYPES;
						} else if (name.indexOf("(java.util.List[])") > 0) {
							gArgTypes = LIST_GROUP_TYPES;
						} else if (
							name.indexOf("(java.math.BigDecimal)") > 0) {
							gArgTypes = BIGDECIMAL_TYPES;
						}
						////////////////////////////////////////////////////////
						if (name.indexOf("(int)") > 0) {
							//get Method Name from outObj
							name =
								name.substring(
									name.indexOf(SET) + SET.length(),
									name.indexOf(JAVA1));

							String getMethodName = "get" + name;
							String setMethodName = "set" + name;
							//copy value to outObj from inObj
							Method g_method =
								outClass.getMethod(setMethodName, INT_TYPES);
							Method s_method =
								inClass.getMethod(getMethodName, sArgTypes);
							Object t = s_method.invoke(inObj, sArgTypes);
							if (t != null) {
								Object[] val = { t };
								g_method.invoke(outObj, val);
							}
						} else if (name.indexOf("(int[])") > 0) {
							//get Method Name from outObj
							name =
								name.substring(
									name.indexOf(SET) + SET.length(),
									name.indexOf(JAVA1));

							String getMethodName = "get" + name;
							String setMethodName = "set" + name;
							//copy value to outObj from inObj
							Method g_method =
								outClass.getMethod(
									setMethodName,
									INT_GROUP_TYPES);
							Method s_method =
								inClass.getMethod(getMethodName, sArgTypes);
							Object t = s_method.invoke(inObj, sArgTypes);
							if (t != null) {
								Object[] val = { t };
								g_method.invoke(outObj, val);
							}
						} else {
							//get Method Name from outObj
							name =
								name.substring(
									name.indexOf(SET) + SET.length(),
									name.indexOf(JAVA));

							String getMethodName = "get" + name;
							String setMethodName = "set" + name;
							//copy value to outObj from inObj
							Method g_method =
								outClass.getMethod(setMethodName, gArgTypes);
							Method s_method =
								inClass.getMethod(getMethodName, sArgTypes);
							Object t = s_method.invoke(inObj, sArgTypes);
							if (t != null) {
								Object[] val = { t };
								g_method.invoke(outObj, val);
							}
						}
					} catch (Exception ex) {
						//ex.printStackTrace();
					}
				}
			}

		} catch (Exception ex) {
			//ex.printStackTrace();
		}
	}
}
